package QianFeng07.IODemo2;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

/**
 * 压缩与解压缩
 * ZipOutputStream
 *      实现文件的压缩
 * ZipOutputStream(OutputStream out)
 *      创建新的ZIP输出流。
 * void putNextEntry(ZipEntry e)
 *      开始写入新的ZIP文件条目并将流定位到条目数据的开始处。
 * ZipEntry(String name) //test/mm.jpg /test/a.txt
 *      使用指定名称创建新的ZIP条目。
 *
 * ZipInputStream
 *      实现文件的解压
 * ZipInputStream(InputStream in)
 *      创建新的ZIP输入流。
 * ZipEntry getNextEntry()
 *      读取下一个ZIP文件条目并将流定位到该条目数据的开始处。
 **/
public class CompressionAndDecompressionDemo {
    public static void main(String[] args) {
        //压缩
        compression("F:\\Test\\bin1.zip", new File("F:\\Test\\bin1"));
        //解压
        decompression("F:\\Test\\bin1.zip","F:\\Test\\jieya");
    }

    /*压缩*/
    private static void compression(String zipFileName, File targetFile) { //参数：（压缩后的文件名，要压缩的目标文件）
        System.out.println("正在压缩中...");
        try {
            ZipOutputStream zOut = new ZipOutputStream(new FileOutputStream(zipFileName));
            BufferedOutputStream bos = new BufferedOutputStream(zOut);
            zip(zOut, targetFile, targetFile.getName(), bos);
            bos.close();
            zOut.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("压缩完成!");
    }
    //zip方法
    private static void zip(ZipOutputStream zOut, File targetFile, String name, BufferedOutputStream bos) throws IOException {
        //判断文件是否是目录
        if (targetFile.isDirectory()) {
            File[] files = targetFile.listFiles();//列出目录下的文件
            if (files.length == 0) {//空文件夹
                zOut.putNextEntry(new ZipEntry(name + "/"));//处理空目录
            }
            for (File f : files) {
                zip(zOut, f, name + "/" + f.getName(), bos);//递归处理
            }
        } else {
            zOut.putNextEntry(new ZipEntry(name));
            InputStream in = new FileInputStream(targetFile);
            BufferedInputStream bis = new BufferedInputStream(in);
            byte[] bytes = new byte[1024];
            int len = -1;
            while ((len = bis.read(bytes)) != -1) {
                bos.write(bytes, 0, len);
            }
            bis.close();
        }
    }


    /*解压*/
    private static void decompression(String targetFileName, String parent) {
        try {
            //构造解压的输入流
            ZipInputStream zIn = new ZipInputStream(new FileInputStream(targetFileName));
            ZipEntry entry = null;
            File file = null;
            while ((entry = zIn.getNextEntry()) != null && !entry.isDirectory()) {
                file = new File(parent, entry.getName());
                if (!file.exists()) {
                    new File(file.getParent()).mkdirs();//创建文件的上级目录
                }
                OutputStream out = new FileOutputStream(file);
                BufferedOutputStream bos = new BufferedOutputStream(out);
                byte[] bytes = new byte[1024];
                int len = -1;
                while ((len = zIn.read(bytes)) != -1) {
                    bos.write(bytes, 0, len);
                }
                bos.close();
                System.out.println(file.getAbsolutePath() + "解压成功");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
